//
//  CZComposeViewController.swift
//  CZ29VVeibo
//
//  Created by apple on 16/7/3.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit

class CZComposeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
    
    // MARK: - 设置视图
    private func setupUI(){
        view.backgroundColor = UIColor.whiteColor()
        setupNav()
        // 添加控件
        view.addSubview(composeTextView)
        view.addSubview(composeToolbar)
        composeTextView.addSubview(pictureView)
        // 添加约束
        // 在ios7 以后 系统检测出有导航栏 textView 的文字下移
        composeTextView.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(view).offset(UIEdgeInsetsZero)
        }
        
        composeToolbar.snp_makeConstraints { (make) -> Void in
            make.leading.trailing.bottom.equalTo(view)
            make.height.equalTo(44)
        }
        
        pictureView.snp_makeConstraints { (make) -> Void in
            make.leading.equalTo(composeTextView).offset(10)
            make.top.equalTo(composeTextView).offset(100)
            make.size.equalTo(CGSize(width: SCREENW - 20, height: SCREENW - 20))
        }
        // 弹出相册
        pictureView.composePictureViewClosure = {[weak self] ()->() in
            self?.selectImages()
        }
        
        
        
        // 监听composeToolbar 中的按钮店家
        composeToolbar.closure = {[weak self] (type: CZComposeToolbarType) ->() in
            switch type{
            case .Picture:
                self?.selectImages()
            case .Mention:
                print("@")
            case .Trend:
                print("#")
            case .Emoticon:
                print("表情")
                self?.switchKeyboard()
            case .Add:
                print("+")

            }
            
        }
        
        
        
        // 通过系统通知监听键盘
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillChangeFrame:", name: UIKeyboardWillChangeFrameNotification, object: nil)
        // 接收表情键盘删除按钮通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "deleteButtonClick", name: EmoticonDeleteNoti, object: nil)
        // 接收表情键盘表情按钮通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "emoticonButtonClick:", name: EmoticonButtonNoti, object: nil)
        
    }
    
    func emoticonButtonClick(noti: NSNotification) {
 
        // 判断object 是否为nil  而且能否转成emoticon
        guard let emoticon =  noti.object as? CZEmoticon else{
            return
        }
        // 是emoji 表情
        if emoticon.isEmoji {
            composeTextView.insertText(((emoticon.code ?? "") as NSString).emoji())
        }else {
            // 纪录composeTextView 上一次富文本纪录
            let oldAttr = NSMutableAttributedString(attributedString: composeTextView.attributedText)
            
            
            // 图片表情
            // 文本附件（使用它 需要设置bounds）
            let att = CZTextAttachment()
            // 设置emoticon
            att.emoticon = emoticon
            // 设置image
            let path = emoticon.path ?? ""
            let png = emoticon.png ?? ""
            let name = path + png
            att.image = UIImage(named: name, inBundle: CZEmoticonTools.sharedTools.emoticonBundle, compatibleWithTraitCollection: nil)
            // 行高
            let lineHeight = composeTextView.font!.lineHeight
            // 设置bounds
            att.bounds =  CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
            
            // 创建一个不可变的富文本
            let attr = NSAttributedString(attachment: att)
            // 获取选中的光标
            let selectRange = composeTextView.selectedRange
            
            // 01拼接方式不可取
            //oldAttr.appendAttributedString(attr)
            // 02插入方式不可取
            //oldAttr.insertAttributedString(attr, atIndex: selectRange.location)
            // 03 替换
            oldAttr.replaceCharactersInRange(selectRange, withAttributedString: attr)
            // 设置富文本的font
            oldAttr.addAttributes([NSFontAttributeName: composeTextView.font!], range: NSRange(location: 0, length: oldAttr.length))
            composeTextView.attributedText = oldAttr
            // 更改composeTextView光标
            composeTextView.selectedRange = NSRange(location: selectRange.location + 1, length: 0)
            // 发送一个系统通知 隐藏或者显示textView 的站位文字
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: nil)
            // 调用代理方法使右侧按钮改变状态
            composeTextView.delegate?.textViewDidChange!(composeTextView)
            
        }
        
        
    }
    
    // 删除按钮事件
    func deleteButtonClick(){
        composeTextView.deleteBackward()
    }
    
    // 监听键盘frame改变
    func keyboardWillChangeFrame(noti: NSNotification){
        // NSRect mac开发中用得 我们移动端开发CGRect 需要我们先把NSRect 转成NSValue
        // 如果rect
        let rect = (noti.userInfo!["UIKeyboardFrameEndUserInfoKey"] as! NSValue).CGRectValue()
        // 更新toolbar 约束
        composeToolbar.snp_updateConstraints { (make) -> Void in
            make.bottom.equalTo(view).offset(rect.origin.y - SCREENH)
        }
        
        UIView.animateWithDuration(0.25) { () -> Void in
            // 更新布局
            self.view.layoutIfNeeded()
        }
    }
    
    // 移除通知
    deinit{
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    // MARK: -  设置导航
    private func setupNav(){
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "cancel")
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "发送", style: UIBarButtonItemStyle.Plain, target: self, action: "send")
        // 右侧按钮不能点击
        navigationItem.rightBarButtonItem?.enabled = false
        navigationItem.titleView = titleView
    }
    // MARK: - 监听事件
    @objc private func cancel(){
        composeTextView.resignFirstResponder()
        dismissViewControllerAnimated(false, completion: nil)
    }
    /*
    A[马到成功]a       发送到服务器  显示在我们app的首页或者pc端 显示A表情a
    */
    @objc private func send(){
//        print("发送微博")
//        
//        
//        print(composeTextView.attributedText)
        /*
            闭包中参数
                01- 遍历的结果
                02- 遍历范围
                04 - 是否停止遍历
        */
        
        var resultStr = ""
        
        // 遍历富文本
        composeTextView.attributedText.enumerateAttributesInRange(NSRange(location: 0, length: composeTextView.attributedText.length), options: []) { (dict, range, _) -> Void in
    
            // 如果是文本附件
            if let att = dict["NSAttachment"] as? CZTextAttachment {
                resultStr += (att.emoticon?.chs ?? "")
            }else {
                // 文字
                let name = (self.composeTextView.attributedText.string as NSString).substringWithRange(range)
                resultStr += name
            }
        }

        // 如果配图中的数组.count > 0 代表发送有图片微博
        if pictureView.imageList.count > 0{
            upload(resultStr)
        }else{
            // 发送文字微博
            update(resultStr)
        }
    }
    
    
    // MARK: - 懒加载控件
    private lazy var titleView: UILabel = {
        
        // 显示的文字
        let name = CZUserAccountTools.sharedTools.userAccount?.screen_name ?? ""
        // 最终显示的文字
        let str = "发微博\n\(name)"
        // 获取range
        let range = (str as NSString).rangeOfString(name)
        // 富文本
        let attr = NSMutableAttributedString(string: str)
        
        // 设置富文本
        attr.addAttributes([NSForegroundColorAttributeName: ThemeColor,NSFontAttributeName: UIFont.systemFontOfSize(13)], range: range)
       
        let lab = UILabel()
        lab.attributedText = attr
        lab.textAlignment = .Center
        lab.numberOfLines = 0
        // 设置大小
        lab.sizeToFit()
        return lab
    }()
    // textView
    private lazy var composeTextView: CZComposeTextView = {
        let view = CZComposeTextView()
//        let txt = UITextField()
//        view.placeholder
        view.placeholder = "我感冒了不想上课我感冒了不想上课我感冒了不想上课我感冒了不想上课我感冒了不想上课我感冒了不想上课我感冒了不想上课"
        view.delegate = self
        // 允许textView 上下拖动
        view.alwaysBounceVertical = true
        // 设置font
        view.font = UIFont.systemFontOfSize(16)
        //view.font
        return view
    }()
    // 底部toolbar
    private lazy var composeToolbar: CZComposeToolbar = CZComposeToolbar()
    // 配图
    private lazy var pictureView: CZComposePictureView = CZComposePictureView()
    // 自定义表情键盘
    private lazy var keyboardView: CZEmoticonKeyboard  = {
        let view = CZEmoticonKeyboard()
        view.frame = CGRect(x: 0, y: 0, width: SCREENW, height: 216)
        return view
    }()

}
// 处理toolbar按钮点击事件
extension CZComposeViewController{
    // 选择图片
    func selectImages() {
        let picker = UIImagePickerController()
        // 设置代理
        picker.delegate = self
        presentViewController(picker, animated: true, completion: nil)
    }
    // 切换键盘
    func switchKeyboard(){
        /*
            如果判断当前显示的系统键盘 还是 自定义表情键盘
        */
        // 代表是系统键盘
        if composeTextView.inputView == nil {
            // 切换成自定义键盘
            composeTextView.inputView = keyboardView
            // 告知composeToolbar 键盘样式
            composeToolbar.isEmoticon = true
        }else {
            // 代表是自定义键盘 
            // 切换成系统键盘
            composeTextView.inputView = nil
            // 告知composeToolbar 键盘样式
            composeToolbar.isEmoticon = false
        }
        // 刷新inputView
        composeTextView.reloadInputViews()
        // 成为第一响应者
        composeTextView.becomeFirstResponder()
    }
}

extension CZComposeViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
        // 方式02
       // let data1 = UIImageJPEGRepresentation(image, 0.2)
        // 压缩图片方式01
       // let data = UIImagePNGRepresentation(scaleImageOfWidth(600, image: image))
       // data1?.writeToFile("/Users/apple/Desktop/哈哈.png", atomically: true)
        //composeTextView.backgroundColor = UIColor(patternImage: image)
        // 填充图片
        pictureView.addImages(scaleImageOfWidth(600, image: image))
        // 如果实现代理方法 系统将不再帮程序员关闭控制器
        picker.dismissViewControllerAnimated(false, completion: nil)
        
    }
    /*
        1200     压缩后的结果  600
         600                 x = 300
        如果 传入的宽度为500  原图返回
    */
    // 压缩图片
    func scaleImageOfWidth(width: CGFloat,image: UIImage) -> UIImage{
        // 如果传入的图片宽度小于我们制定压缩宽度的话 直接返回
        if width > image.size.width {
            return image
        }
        // 等比例计算出图片的高度
        let height = (width * image.size.height) / image.size.width
        // 创建一个rect
        let rect =  CGRect(x: 0, y: 0, width: width, height: height)
        // 还记得大明湖畔的上下文吗？
        // 01- 开启上下文
        UIGraphicsBeginImageContext(rect.size)
        // 02- 将image 渲染到上下文中
        image.drawInRect(rect)
        // 03- 获取上下文的结果
        let result = UIGraphicsGetImageFromCurrentImageContext()
        // 04- 关闭上下文
        UIGraphicsEndImageContext()
        return result
    }
}

// 发送微博请求
extension CZComposeViewController{
    // 发送文字微博
    func update(status: String){
        CZNetworktools.sharedTools.composeUpdate(status, success: { (response) -> () in
            print("发送成功")
            }) { (error) -> () in
                print("发送失败")
        }

    }
    /*
        通过该接口发送有图片微博 不管你发送多少张 微博服务器只接受你最后一张
    */
    // 上传图片且有文字微博
    func upload(status: String){
        
        CZNetworktools.sharedTools.comoposeUpload(status, imageList: pictureView.imageList, success: { (response) -> () in
                print("发送成功")
            }) { (error) -> () in
                print("发送失败")
        }
    }
}

extension CZComposeViewController: UITextViewDelegate{
    // 监听textView 的文字改变
    func textViewDidChange(textView: UITextView) {
        navigationItem.rightBarButtonItem?.enabled = textView.hasText()
    }
    func scrollViewDidScroll(scrollView: UIScrollView) {
        composeTextView.resignFirstResponder()
    }
}

extension CZComposeViewController{
    // 该方法已经抽取到工具类中
    func demo(){
        // 请求url
        let URLString = "https://upload.api.weibo.com/2/statuses/upload.json"
        // 请求参数
        let params = [
            "access_token":CZUserAccountTools.sharedTools.accessToken!,
            "status":composeTextView.text
            
        ]
        // 发送请求
        CZNetworktools.sharedTools.POST(URLString, parameters: params, constructingBodyWithBlock: { (formdata) -> Void in
            // 以表单形式提交（拼接到表单后面提交）
            /*
            data : 将要上传到服务器的二进制文件
            name : 服务器要求规定好文件名称(协议)
            fileName:  上传文件完成后保存到服务器的文件路径 （新浪微博不需要你指定 都会按着自己的方式保存到响应的文件夹中）--- 随意传
            mimeType: 指定上传的二进制文件的格式 application/octet-stream 忽略上传文件的格式
            如果指定为图片 image/jpeg （大类型/ 小类型）
            */
            
            // 遍历数组
            for image in self.pictureView.imageList {
                // image 转二进制
                let data = UIImagePNGRepresentation(image)!
                
                formdata.appendPartWithFileData(data, name: "pic", fileName: "oooo", mimeType: "application/octet-stream")
            }
            
            
            }, progress: nil, success: { (_, response) -> Void in
                print("发送成功")
            }) { (_, error) -> Void in
                print("发送失败")
        }
    }
}
